package cn.tedu.tickets;
/*需求:设计多线程模型,4个售票窗口共计售票100张
 * 本方案使用多线程编程实现方案1:继承Thread类的方式来完成*/
public class TestThread {
    public static void main(String[] args) {
        //3.创建多个自定义类对象作为线程对象
        TicketThread t1 = new TicketThread("窗口1"); /*传入的字符串参数就线程名字*/
//        TicketThread t11 = new TicketThread(); /*传入的字符串参数就线程名字*/
        TicketThread t2 = new TicketThread("窗口22");
        TicketThread t3 = new TicketThread("窗口333");
        TicketThread t4 = new TicketThread("窗口4444");
        //4.以多线程的方式启动线程对象
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
//1.自定义多线程售票类,继承Thread
class TicketThread extends Thread{

    public TicketThread(String name) {
        super(name);
    }

    static int tickets = 100;
    //2.重写run(),里面是我们的业务

    /*public TicketThread() {
        //表示调用父类的含参构造,因为实际上起名的功能是父类完成的
         // 所以我们需要将本构造函数接到的名字参数,传给父类的构造函数,让父类起名字
        //第一行不写super();也会默认存在
        super();
    }*/
    /*添加本类的含参构造,用于给线程对象起名字
    由于只添加了这一个含参构造,默认的无参构造被覆盖掉了*/
    //3.定义成员变量,用来保存票数
    /*问题:4个线程对象共计售票400张,原因是创建了4个本类的对象,各自操作各自的成员变量
     * 解决:让所有对象共享同一个变量,这个变量需要设置为静态的*/

    @Override
    public void run() {

        //4.1循环卖票
        while (true) {
            /*让每个线程经历休眠,增加线程状态切换的频率与出错的概率,产生了问题:
             * 问题1:产生了重卖的现象:同一张票卖给了多个人
             * 问题2:产生了超卖的现象:超出了规定的票数,出现了0 -1 -2这样的票*/
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //4.2打印当前正在卖票的线程名称,并且票数-1
            /*for (int i = 100; i > 0; i--) {
                System.out.println(getName()+"="+i);
            }*/

            System.out.println(getName()+"="+tickets--);

            //4.3做判断,如果没有票了,就退出死循环
            if (tickets <= 0) break;//注意!死循环必须设置出口!
//            if(i <= 1) break;//注意!死循环必须设置出口!

            //如果if的{}里的语句只有一句,大括号可以省略不写

        }
    }
}